Const- const non-member variable
- const member variable
- const pointer variable
- const member function(method)
const non-member variable변할 수 없는 상수임을 의미하며, 선언시에 초기화 해주어야 한다.
const int num=1;
int const num=1;
num=2;
const member variableconst 변수는 반드시 선언 시 초기화 해야 한다.(초기화 하지 않을 경우, compile error 발생)
class의 멤버 변수를 const로 선언 시, 초기화 리스트(Initialize List)를 사용해야 한다.
class Foo{
const int num;
Foo(void): num(1) {}
};
class Bar{
const int num;
Bar(void){
num=1;
}
}
const member variable에 대하여서 초기화 리스트로 초기화 할 경우, 선언과 동시에 초기화 함과 동일한 의미이다.
하지만 생성자 내부 함수에서 초기화를 시도할 경우,
이는 초기화가 아닌 const int num; 을 선언한 후,
num=1; 을 시도함과 같다. 따라서 2번의 compile error 출력
class 내부에서 const int num; 을 선언해 줌은 메모리를 할당한 것이 아닌,
컴파일러에게 class의 구조를 알려줌이다.
초기화 리스트를 통한 초기화는 객체 생성 시, num 메모리 할당 후 바로 초기화 함
C++11부터는 아래와 같이 선언 및 초기화가 가능하다.
class Foo{
const int num=1;
}
보통은 위처럼 선언하지 않고 static을 이용해서 선언해 주는 것이 맞다.
static으로 선언 시, 객체 생성시 마다 num을 생성하지 않고,
메모리 상에 한번만 할당하고 공유해서 사용함
const pointer variablepointer에 const를 사용할 때 두 가지 경우가 존재한다.
1. const 위치가 맨 앞에 있으며, 포인터 변수가 가리키는 값에 대하여 상수화
2. const 위치가 type과 변수 이름 사이에 있으면서, 포인터 변수 자체를 상수화
2번째 사용방법은 C++의 reference와 동작이 유사하기 때문에 잘 사용되지 않음
참조자(reference)는 애초에 참조하는 대상을 변경할 수 없음
int num=1;
const int* ptr=#
*ptr=2;
num=2;
int num1=1;
int num2=2;
int* const ptr=&num1;
ptr=&num2;
int num=1;
const int* const ptr=#
const int& ref=num;
const member function(method)const member function은 class의 멤버 함수만 const로 상수화 시킬 수 있고,
non-member function은 const 함수로 선언이 불가능하다.
해당 멤버 함수 내에서는 모든 멤버 변수를 상수화 시킴을 의미한다.
지역 변수는 변경 가능
int GetString(void) const;
class Foo{
int num=1;
int GetNum(void) const{
int a=1;
a++;
num++;
return num;
}
}